/*
 * Copyright (c) 2021 Huawei Device Co., Ltd.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * introduction:
 *  机器人电机驱动
 */

#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"

#include "iot_gpio.h"
#include "iot_pwm.h"
#include "hi_io.h"
#include "motor.h"

void Motor_Init(void)
{
    IoTGpioInit(IN1);
    IoTGpioInit(IN2);
    IoTGpioInit(IN3);
    IoTGpioInit(IN4);

    hi_io_set_func(IN1, HI_IO_FUNC_GPIO_5_GPIO);
    hi_io_set_func(IN2, HI_IO_FUNC_GPIO_6_GPIO);
    hi_io_set_func(IN3, HI_IO_FUNC_GPIO_7_GPIO);
    hi_io_set_func(IN4, HI_IO_FUNC_GPIO_8_GPIO);

    IoTGpioSetDir(IN1, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(IN2, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(IN3, IOT_GPIO_DIR_OUT);
    IoTGpioSetDir(IN4, IOT_GPIO_DIR_OUT);

    // motor init stop
    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE0);
}
void Turn_left(unsigned int circle_time)
{
    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE1);
    usleep(circle_time);
}

void Turn_right(unsigned int circle_time)
{
    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE0);
    usleep(circle_time);
}

void Forward(unsigned int circle_time)
{
    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE0);
    usleep(circle_time);
}

void Backward(unsigned int circle_time)
{

    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE1);
    usleep(circle_time);
}

void Circle(unsigned int circle_time)
{
    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE1);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE0);
    usleep(circle_time);
    usleep(circle_time);
}

void Stop_motor()
{
    // motor init stop
    IoTGpioSetOutputVal(IN1, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN2, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN3, IOT_GPIO_VALUE0);
    IoTGpioSetOutputVal(IN4, IOT_GPIO_VALUE0);
}
